﻿//Portfolio.cs
//Copyright (c) 2013 StockSharp LLC, all rights reserved.
//This code module is part of StockSharp library.
//This code is licensed under the GNU GENERAL PUBLIC LICENSE Version 3.
//See the file License.txt for the license details.
//More info on: http://stocksharp.com

namespace StockSharp.BusinessEntities
{
	using System;
	using System.ComponentModel;
	using System.Runtime.Serialization;
	using System.Xml.Serialization;

	using Ecng.Serialization;

	/// <summary>
	/// Портфель, описывающий торговый счет и размер сгенерированной комиссии по нему.
	/// </summary>
	[Serializable]
	[System.Runtime.Serialization.DataContract]
	[DisplayName("Портфель")]
	[Description("Портфель, описывающий торговый счет и размер сгенерированной комиссии по нему.")]
	public class Portfolio : BasePosition
	{
		/// <summary>
		/// Создать <see cref="Portfolio"/>.
		/// </summary>
		public Portfolio()
		{
		}

		private string _name;

		/// <summary>
		/// Кодовое название портфеля.
		/// </summary>
		[DataMember]
		[Identity]
		[DisplayName("Название")]
		[Description("Кодовое название портфеля.")]
		[Category("Основные")]
		public string Name
		{
			get { return _name; }
			set
			{
				if (_name == value)
					return;

				_name = value;
				Notify("Name");
			}
		}

		private decimal _leverage;

		/// <summary>
		/// Плечо маржи.
		/// </summary>
		[DataMember]
		[DisplayName("Плечо")]
		[Description("Плечо маржи.")]
		[Category("Основные")]
		public decimal Leverage
		{
			get { return _leverage; }
			set
			{
				if (_leverage == value)
					return;

				_leverage = value;
				Notify("Leverage");
			}
		}

		private decimal _variationMargin;

		/// <summary>
		/// Вариационная маржа.
		/// </summary>
		[DataMember]
		[DisplayName("Вариационная маржа")]
		[Description("Вариационная маржа.")]
		[Category("Основные")]
		public decimal VariationMargin
		{
			get { return _variationMargin; }
			set
			{
				if (_variationMargin == value)
					return;

				_variationMargin = value;
				Notify("VariationMargin");
			}
		}

		private decimal _commission;

    	/// <summary>
		/// Общий размер комиссий.
		/// </summary>
		[DataMember]
		[DisplayName("Комиссия")]
		[Description("Общий размер комиссий.")]
		[Category("Основные")]
		public decimal Commission
    	{
    		get { return _commission; }
    		set
    		{
    			if (_commission == value)
					return;

    			_commission = value;
    			Notify("Commission");
    		}
    	}

		private CurrencyTypes _currency = CurrencyTypes.RUB;

		/// <summary>
		/// Валюта портфеля. По-умолчанию равно <see cref="CurrencyTypes.RUB"/>.
		/// </summary>
		[DataMember]
		[DisplayName("Валюта")]
		[Description("Валюта портфеля.")]
		[Category("Основные")]
		public CurrencyTypes Currency
		{
			get { return _currency; }
			set
			{
				_currency = value;
				Notify("Currency");
			}
		}

		[field: NonSerialized]
		private ITrader _trader;

		/// <summary>
		/// Шлюз к торговой системе, через который был загружен данный портфель.
		/// </summary>
		[Ignore]
		[XmlIgnore]
		[Browsable(false)]
		public ITrader Trader
		{
			get { return _trader; }
			set { _trader = value; }
		}

		/// <summary>
		/// Биржевая площадка, для которой действует данный портфель.
		/// </summary>
		[RelationSingle(IdentityType = typeof(string))]
		[DataMember]
		[DisplayName("Площадка")]
		[Description("Биржевая площадка, для которой действует данный портфель.")]
		[Category("Основные")]
		public ExchangeBoard ExchangeBoard { get; set; }

		private static readonly Portfolio _anonymousPortfolio = new Portfolio { Name = "Анонимный счет" };

		/// <summary>
		/// Портфель, ассоциированный с заявками, полученные через лог заявок.
		/// </summary>
		public static Portfolio AnonymousPortfolio
		{
			get { return _anonymousPortfolio; }
		}

		/// <summary>
		/// Получить строковое представление.
		/// </summary>
		/// <returns>Строковое представление.</returns>
		public override string ToString()
		{
			return Name;
		}
	}
}
